LINQは C# の業務アプリで最も使われる機能のひとつです。 しかし、実務では 「よく使うパターン」 が決まっています。 この記事では、現場で毎日使う LINQ の実務パターンを体系的にまとめました。
この記事でわかること
・検索(Where)
・変換(Select)
・ソート(OrderBy)
・グループ化(GroupBy)
・JOIN(内部/左外部)
・Distinct・重複排除
・集計(Sum/Count/Max/Min)
・辞書化(ToDictionary)
・存在チェック(Any/All)
・高速化テクニック(遅延実行の罠)
・検索(Where)
・変換(Select)
・ソート(OrderBy)
・グループ化(GroupBy)
・JOIN(内部/左外部)
・Distinct・重複排除
・集計(Sum/Count/Max/Min)
・辞書化(ToDictionary)
・存在チェック(Any/All)
・高速化テクニック(遅延実行の罠)
1. Where(検索)
■ 1-1. 単純条件
var adults = users.Where(x => x.Age >= 20);
■ 1-2. 複数条件
var result = users.Where(x => x.Age >= 20 && x.IsActive);
■ 1-3. 部分一致(Contains)
var result = users.Where(x => x.Name.Contains("山"));
2. Select(変換)
■ 2-1. プロパティ抽出
var names = users.Select(x => x.Name);
■ 2-2. 匿名型に変換
var list = users.Select(x => new { x.Id, x.Name });
■ 2-3. DTOに変換
var dtos = users.Select(x => new UserDto(x.Id, x.Name));
3. OrderBy(ソート)
■ 3-1. 昇順
var sorted = users.OrderBy(x => x.Age);
■ 3-2. 降順
var sorted = users.OrderByDescending(x => x.CreatedAt);
■ 3-3. 複数キー
var sorted = users
.OrderBy(x => x.Department)
.ThenBy(x => x.Name);
4. GroupBy(グループ化)
■ 4-1. 部署ごとにグループ化
var groups = users.GroupBy(x => x.Department);
■ 4-2. グループごとに集計
var result = users
.GroupBy(x => x.Department)
.Select(g => new
{
Department = g.Key,
Count = g.Count(),
AvgAge = g.Average(x => x.Age)
});
5. JOIN(内部結合 / 左外部結合)
■ 5-1. 内部結合(Inner Join)
var result =
from u in users
join d in departments on u.DepartmentId equals d.Id
select new { u.Name, Department = d.Name };
■ 5-2. 左外部結合(Left Join)
var result =
from u in users
join d in departments on u.DepartmentId equals d.Id into gj
from d in gj.DefaultIfEmpty()
select new { u.Name, Department = d?.Name ?? "未所属" };
6. Distinct(重複排除)
■ 6-1. 単純な重複排除
var uniqueNames = users.Select(x => x.Name).Distinct();
■ 6-2. 複数キーで重複排除
var unique = users
.GroupBy(x => new { x.Name, x.Age })
.Select(g => g.First());
7. 集計(Sum / Count / Max / Min / Average)
■ 7-1. 合計
var total = orders.Sum(x => x.Amount);
■ 7-2. 最大・最小
var max = users.Max(x => x.Age);
var min = users.Min(x => x.Age);
■ 7-3. 平均
var avg = users.Average(x => x.Age);
8. ToDictionary(辞書化)
■ 8-1. ID → User の辞書
var dict = users.ToDictionary(x => x.Id);
■ 8-2. キー重複に注意
重複すると例外が出るため、GroupByで吸収する:
var dict = users
.GroupBy(x => x.Id)
.ToDictionary(g => g.Key, g => g.First());
9. Any / All(存在チェック)
■ 9-1. 存在チェック
if (users.Any(x => x.Id == id)) { ... }
■ 9-2. 全件が条件を満たすか
bool allAdult = users.All(x => x.Age >= 20);
10. First / FirstOrDefault の使い分け
■ 10-1. First(空だと例外)
var user = users.First(x => x.Id == id);
■ 10-2. FirstOrDefault(空なら null)
var user = users.FirstOrDefault(x => x.Id == id);
実務では FirstOrDefault が安全。
11. LINQ 高速化テクニック(遅延実行の罠)
■ 11-1. ToList() を早めに呼ぶ
LINQ は遅延実行のため、 同じクエリを複数回評価して遅くなることがある。
var list = users.Where(x => x.Age >= 20).ToList(); // 1回で確定
■ 11-2. Where → ToList → Select の連続は遅い
1回のクエリにまとめる:
var names = users
.Where(x => x.Age >= 20)
.Select(x => x.Name)
.ToList();
■ 11-3. 大量データは for が最速
LINQ は可読性重視。 10万件以上の処理は for の方が速い。
12. 業務アプリ向けベストパターンまとめ
- 検索 → Where
- 変換 → Select
- ソート → OrderBy / ThenBy
- グループ化 → GroupBy + Select
- JOIN → Inner / Left Join
- 重複排除 → Distinct / GroupBy
- 集計 → Sum / Count / Average
- 辞書化 → ToDictionary
- 存在チェック → Any / All
- 安全取得 → FirstOrDefault
- 高速化 → 遅延実行に注意、ToListで確定
まとめ:LINQは“パターンで覚える”と実務が圧倒的に速くなる
- LINQは実務で使うパターンが決まっている
- GroupBy・Join・Select の組み合わせが最重要
- 遅延実行の理解が高速化の鍵
- ToList の位置でパフォーマンスが変わる
「LINQをもっと使いこなしたい」「現場で使える書き方を知りたい」 というニーズに対して、この記事のパターンはすべて即戦力です。 あなたのプロジェクトに合わせて最適なLINQ設計を組み立ててみてください。